package com.atguigu.lease.web.admin.schedule;

import com.atguigu.lease.common.minio.MinioProperties;
import com.atguigu.lease.model.entity.LeaseAgreement;
import com.atguigu.lease.model.enums.LeaseStatus;
import com.atguigu.lease.web.admin.service.GraphInfoService;
import com.atguigu.lease.web.admin.service.LeaseAgreementService;;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import io.minio.MinioClient;
import io.minio.RemoveObjectArgs;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;


import java.util.Date;
import java.util.List;

/**
 * ClassName: ScheduledTasks
 * Description:
 *
 * @Author 刘艳丽
 * @Create 2024/9/23 17:32
 * @Version 1.0
 */
@Component
public class ScheduledTasks {

    @Autowired
    LeaseAgreementService leaseAgreementService;
    @Autowired
    MinioClient minioClient;
    @Autowired
    MinioProperties minioProperties;
    @Autowired
    GraphInfoService graphInfoService;


    /**
     * 自动检查租约状态: 2 已签约   5 退租待确认
     * 如果租约到期(lease_end_date 租约结束日期 小于 当前日期) 且没逻辑删除状态下,
     * 自动把状态设置为已到期(4)
     */
    //@Scheduled(cron = "0/2 * * * * *")
    public void checkLeaseStatus(){
        System.out.println("修改状态" + new Date());

        /**
         * 该Java代码使用Lambda更新包装器更新租赁协议的状态：
         * 筛选状态为“已签约”或“退租待确认”的记录。
         * 进一步筛选出租赁结束日期小于当前日期的记录。
         * 将符合条件的记录状态设置为“已到期”
         */
        leaseAgreementService.update(new LambdaUpdateWrapper<LeaseAgreement>()
                .in(LeaseAgreement::getStatus, LeaseStatus.SIGNED, LeaseStatus.WITHDRAWING) // 签约状态为已签约或退租待确认
                .lt(LeaseAgreement::getLeaseEndDate, new Date())  // 退租时间小于当前时间
                .set(LeaseAgreement::getStatus, LeaseStatus.EXPIRED)  // 设置状态为已到期
        );
    }

    /**
     * 该方法会被定时调度执行
     * 每隔2秒执行一次
     * 是一种在后台定期执行任务的方式，常用于计划任务
     */
   // @Scheduled(cron = "0/2 * * * * *")
    public void removeMinioImage() {
        try {
            // 从graphInfoService获取待删除图片URL列表
            List<String> urlList = graphInfoService.listRemoveImage();
            /**
             * 遍历URL列表，对每个URL执行以下操作：
             * 提取URL中的文件名。
             * 使用MinIO客户端删除指定桶中的对应文件
             */
            for (String url : urlList) {
                if (url != null) {
                    /**
                     * 该行代码功能简单，从给定的URL中提取最后一个斜杠 ("/") 之后的部分作为文件名。
                     * url.lastIndexOf("/")：找到最后一个斜杠的位置。
                     * + 1：从该位置后一个字符开始截取。
                     * substring：从指定位置到字符串结尾的子串作为文件名 fileName。
                     *
                     * public String substring(int index) 从指定位置截取到字符串末尾
                     * public int lastIndexOf(String str)  查找某个字符串最后一次出现位置 没有找到返回-1
                     */
                    String fileName = url.substring(url.lastIndexOf("/") + 1);
                    /**
                     * 该Java函数使用MinIO客户端删除指定桶中的对象（文件）。
                     * minioClient：MinIO客户端实例。
                     * removeObject：删除对象方法。
                     * RemoveObjectArgs.builder()：构建删除对象参数。
                     * .bucket(minioProperties.getBucketName())：设置桶名。
                     * .object(fileName)：设置要删除的对象名（文件名）。
                     */
                    minioClient.removeObject(RemoveObjectArgs.builder().bucket(minioProperties.getBucketName()).object(fileName).build());
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}
